#include "pch.hpp"
#include "ErrorModel.hpp"
#include "DocumentWindow.hpp"

using namespace Engine;
using namespace Engine::Edit;




ErrorModel::ErrorModel(DocumentWindow* window)
	: m_window(window)
{
	m_icons.insert(std::make_pair(logger::entry::error,   QPixmap(":/icons/error")));
	m_icons.insert(std::make_pair(logger::entry::warning, QPixmap(":/icons/warning")));
	m_icons.insert(std::make_pair(logger::entry::info,    QPixmap(":/icons/information")));
	m_icons.insert(std::make_pair(logger::entry::debug,   QPixmap(":/icons/bug")));
}
///////////////////////////////////////////////////////////////////////////////////////////////////

ErrorModel::~ErrorModel()
{}
///////////////////////////////////////////////////////////////////////////////////////////////////




DocumentWindow* ErrorModel::documentWindow() const
{
	return m_window;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




void ErrorModel::add(const logger::entry& e)
{
	beginInsertRows(QModelIndex(), rowCount(), rowCount());
	m_entries.push_back(e);
	endInsertRows();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void ErrorModel::remove(const logger::entry& e)
{
	std::size_t index = 0;
	for(auto i = m_entries.begin(); i != m_entries.end(); ++i, ++index)
	{
		if(*i == e)
		{
			beginRemoveRows(QModelIndex(), index, index);
			m_entries.erase(i);
			endRemoveRows();

			return;
		}
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

void ErrorModel::clear()
{
	std::size_t oldSize = m_entries.size();
	if(m_entries.size() > 0)
	{
		beginResetModel();
		m_entries.clear();
		endResetModel();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

int ErrorModel::rowCount(logger::entry::Level lvl) const
{
	int count = 0;
	for(auto i = m_entries.begin(); i != m_entries.end(); ++i)
		count += i->lvl == lvl ? 1 : 0;
	return count;
}
///////////////////////////////////////////////////////////////////////////////////////////////////




int ErrorModel::rowCount(const QModelIndex& index) const
{
	if(index.isValid())
		return 0;

	return m_entries.size();
}
///////////////////////////////////////////////////////////////////////////////////////////////////

int ErrorModel::columnCount(const QModelIndex& index) const
{
	if(index.isValid())
		return 0;

	return 6;
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QVariant ErrorModel::headerData(int section, Qt::Orientation orientation, int role) const
{
	return _headerData(section, orientation, role);
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QVariant ErrorModel::_headerData(int section, Qt::Orientation orientation, int role)
{
	if(orientation != Qt::Horizontal)
		return QVariant();

	if(role != Qt::DisplayRole)
		return QVariant();

	switch(section)
	{
	case 0:  return QVariant();
	case 1:  return tr("Description");
	case 2:  return tr("File");
	case 3:  return tr("Function");
	case 4:  return tr("Line");
	case 5:  return tr("Module");
	default: return QVariant();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////

QVariant ErrorModel::data(const QModelIndex& index, int role) const
{
	if(index.row() >= rowCount())
		return QVariant();

	const logger::entry& e = m_entries[index.row()];

	switch(role)
	{
	case Qt::DisplayRole:
		switch(index.column())
		{
		case 0:  return index.row() + 1;
		case 1:  return e.message;
		case 2:  return e.file;
		case 3:  return e.function;
		case 4:  return e.line;
		case 5:  return e.module;
		default: return QVariant();
		}
	case Qt::DecorationRole:
		switch(index.column())
		{
		case 0:  { auto i = m_icons.find(e.lvl); return (i != m_icons.end()) ? i->second : QVariant(); }
		default: return QVariant();
		}
	case Qt::UserRole:
		switch(index.column())
		{
		case 0: return logger::entry::toString(e.lvl);
		default: return QVariant();
		}
	default:
		return QVariant();
	}
}
///////////////////////////////////////////////////////////////////////////////////////////////////
